<?php 
class UsersController extends AppController {	
	
	var $name 		= 'Users';
	var $helpers 	= array('Html'); //TODO - helpers are in app_controller, not needed here
	var $uses 		= array(
		'User'
	);
	
	public $paginate = array(
        'limit' => 10,
        'order' => array(
            'User.username' => 'asc'
        )
    );
	
	function beforeFilter() {
	    parent::beforeFilter();
	    $this->set('title_for_layout', 'Užívatelia');
	    $this->Auth->allow('login', 'logout', 'setlimit', 'getlimit');
		$this->Auth->authorize = 'actions';
	    $this->userLevel = $this->Session->read('Auth.User.userlevel');
		if ($this->userLevel == USER_LEVEL_ADMIN)
			$this->Auth->allow('login', 'logout', 'admin_profile');
	    if ($this->userLevel == USER_LEVEL_SUPERADMIN)
			$this->Auth->allow('*');

		//ak ideme na inu akciu, ako search, zmazeme ulozene search data
		if($this->request->params['action'] != 'search') {
			$this->Session->delete('Search');	
		}
	}
	
	/**
	 * Defaultná metóda controlleru 
	 * 
	 * Vykoná presmerovanie na metódu „admin_list“
	 * 
	 */
	function index() {
		$this->redirect(array('admin' => true, 'controller' => 'users', 'action' => 'list'));		
	}
	
	/**
	 * Nastavenie list limitu 
	 * 
	 * Nastavi pocet vylistovanych zaznamov pri listingoch a searhcoch
	 * 
	 * @param int $limit
	 * 
	 */
	function setlimit($limit) {
		$this->Cookie->write('limit', '' . $limit);
		$this->redirect($this->request->referer());		
	}
	
	/**
	 * Zistenie list limitu 
	 * 
	 * Vrati pocet vylistovanych zaznamov pri listingoch a searhcoch
	 * 
	 */
	function getlimit() {
		return $this->Cookie->read('limit');		
	}
	
	//LOGIN
	
	/**
	 * Prihlasovanie užívateľa
	 * 
	 * Pokiaľ nie sú poslané žiadne POST data, metóda navykonáva žiadnu akciu a presmeruje volanie na domovskú stránku. 
	 * Ak sú zaslané POST data, metóda ich skontroluje. Ak nie sú korektné, vytvorí sa príslušná chybová správa a zavolá sa presmerovanie na referer. 
	 * Ak sú dáta správne, systém prihlási užívateľa, metóda potom vygeneruje správu o úspešnom prihlásení a zavolá presmerovanie na referer.
	 * 
	 */
	function login() {
		if ($this->Auth->login()) {
        	$this->redirect($this->Auth->redirect());
    	} else {
        	$this->Session->setFlash(__('Zlé meno, alebo heslo. Skúste ešte raz.'));
    }
		
	}
	
	/**
	 * Odhlasovanie užívateľa
	 * 
	 * V prípade, že užívateľ nie je prihlásený, metóda zavolá presmerovanie na domovskú stránku. 
	 * Ak je užívateľ prihlásený, systém zruší jeho prihlásenie, metóda vygeneruje správu o úspešnom odhlásení a  zavolá presmerovanie na domovskú stránku.
	 * 
	 */
	function logout() {
		$this->redirect($this->Auth->logout());
	}
	
	//SUPERADMIN
	
	/**
	 * Listing užívateľov 
	 * 
	 * Za pomoci componentu „Pagination“ získa metóda príslušný počet záznamov typu „User“ a pošle ich do view.
	 * 
	 * http://book.cakephp.org/2.0/en/core-libraries/components/pagination.html
	 * 
	 */
	function admin_list() {
		//skontroluje, ci je prihlaseny superadmin
		if ($this->userLevel < USER_LEVEL_SUPERADMIN) 
			$this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
		
		if (is_int($this->Cookie->read('limit')))
			$this->paginate['limit'] = $this->Cookie->read('limit');
			
		//ziskanie zaznamov
		$data = $this->paginate('User');
		$this->set('data', $data);
	}
	
	/**
	 * Pridanie užívateľa 
	 * 
	 * Ak nie sú poslané žiadne POST data, metóda nevykonáva žiadnu akciu a zobrazí sa pridávací formulár. 
	 * Ak sú poslané, metóda skontroluje, či sú dáta korektné. Ak nie, vygeneruje o tom správu. 
	 * Ak áno, uloží poslané údaje do databázy a vygeneruje správu o úspešnom pridaní záznamu.
	 * 
	 * http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html#adding-posts
	 * 
	 */
	function admin_add() {
		//skontroluje, ci je prihlaseny superadmin
		if ($this->userLevel < USER_LEVEL_SUPERADMIN) 
			$this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));	
			
		//kontrola poslanych udajov
		if (!empty($this->request->data)) {
			
			if ($this->User->save($this->request->data))
				$this->Session->setFlash(USER_ADDED, 'default', array());
			else
				$this->Session->setFlash(USER_NOT_ADDED, 'default', array());
			
		}
	}
	
	/**
	 * Editovanie užívateľa
	 * 
	 * Ak nie sú poslané žiadne POST data, ani id, metóda zavolá presmerovanie na metódu „admin_list“. 
	 * Ak je poslané iba id, metóda získa z databázy záznam typu „User“ s príslušným id a odošle ho do view, ktorý zobrazí editovací formulár. 
	 * Ak záznam s príslušným id neexistuje, metóda vygeneruje správu a zavolá presmerovanie na metódu „admin_list“. 
	 * Ak sú poslané POST data, metóda skontroluje, či sú dáta korektné. Ak nie, vygeneruje o tom správu. 
	 * Ak áno, uloží poslané údaje do databázy a vygeneruje správu o úspešnom uložení záznamu.
	 * 
	 * http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html#editing-posts
	 * 
	 * @param int $id
	 */
	function admin_edit($id = NULL) {		
		//skontroluje, ci je prihlaseny superadmin
		if ($this->userLevel < USER_LEVEL_SUPERADMIN) 
			$this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
		
		//skontroluje, ci je nastavene id, alebo su poslane postdata
		if ($id == NULL && !empty($this->request->data)) 
			$this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
		
		//ulozi poslane data
		if ($this->request->is('post')) {
			//ak je heslo prazdne, tak ho neukladame
			if ($this->request->data['User']['password'] == '')
				unset($this->request->data['User']['password']);
			if ($this->User->Save($this->request->data)) {
				//pri uspesnom ulozeni nastavime hlasku o uspesnoti a presmerujeme na listing uzivatelov
				$this->Session->setFlash(USER_EDITED);
				$this->redirect(array('admin' => true, 'controller' => 'users', 'action' => 'list'));
			} 
			else
				//pri neuspesnom ulozeni nastavime hlasku o neuspesnosti
				$this->Session->setFlash(USER_NOT_EDITED);
		}
		else {
			//nacitam usera do $this->request->data, kde bude pristupny vo view
			$this->request->data = $this->User->read(null, $id);
		}
	}
	
	/**
	 * Zmazanie užívateľa
	 * 
	 * Ak nie je poslané id, metóda zavolá presmerovanie na metódu „admin_list“. Ak je poslané id, metóda sa pokúsi záznam vymazať. 
	 * Potom vygeneruje správu o úspešnosti a zavolá presmerovanie na referer.
	 * 
	 * http://book.cakephp.org/2.0/en/tutorials-and-examples/blog/part-two.html#deleting-posts
	 * 
	 * @param int $id
	 */
	function admin_delete($id = null) {
		//skontroluje, ci je prihlaseny superadmin
		if ($this->userLevel < USER_LEVEL_SUPERADMIN) 
			$this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
		
		//skontroluje, ci je nastavene id
		if ($id == NULL) 
			$this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
			
		//pokusime sa vymazat usera z DB
		if ($this->User->delete($id))
			//pri uspesnom zmazani nastavime hlasku o uspesnoti
			$this->Session->setFlash(USER_DELETED);
		else
			//pri neuspesnom zmazani nastavime hlasku o neuspesnosti
			$this->Session->setFlash(USER_NOT_DELETED);
		
		//zavolame presmerovanie na listing userov
		$this->redirect(array('admin' => true, 'controller' => 'users', 'action' => 'list'));
	}
	
	//PROFILE
	/**
	 * Zmena hesla pre prihláseného užívateľa
	 * 
	 * Ak nie sú poslané POST data, metóda nevykonáva žiadnu akciu. 
	 * Ak sú poslané POST data, metóda skontroluje, či je poslané „pôvodné heslo“ rovnaké, 
	 * ako aktuálne heslo prihláseného užívateľa a či sú „nové heslo“ a „opakované nové heslo“ zhodné. 
	 * Ak áno, metóda uloží zmeny a vygeneruje správu o úspešnej zmene hesla. Ak nie, metóda vygeneruje príslušnú chybovú správu.
	 */
	function admin_profile() {
		//skontrolujeme ci su poslane nejake data
		if (!empty($this->request->data)) {
			//skontrolujeme povodne heslo a ci bolo nove heslo zadane 2 krat rovnako
			if(AuthComponent::password($this->request->data['User']['password_old']) != $this->Session->read('Auth.User.password')) {
				$this->Session->setFlash(USER_BAD_PASS);
				$this->redirect(array('admin' => true, 'controller' => 'users', 'action' => 'profile'));
			}
			//TODO!!!
			if ($this->request->data['User']['password'] != $this->request->data['User']['password_repeat']) {
				$this->Session->setFlash(USER_PASS_NO_MATCH);
				$this->redirect(array('admin' => true, 'controller' => 'users', 'action' => 'profile'));
			}
			
			//aby nejaky user nemohol menit nic ine, okrem svojho hesla, z prijatych dat vyberieme iba heslo a pouzijeme id prihlaseneho uzivatela
			$user['User'] = array(
				'id' =>  $this->Session->read('Auth.User.id'), 
				'password' => $this->request->data['User']['password']
			);
			//snazime sa ulozit poslane data (id prihlaseneho uzivatela a ziskane nove heslo)
			if ($this->User->save($user)) {
				//po usmesnej zmene hesla nastavime hlasku o uspesnoti a presmerujeme na homepage
				$this->Session->setFlash(USER_PASS_CHANGED);
				$this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
			}
			else
				//pri neuspesnom pokuse nastavime hlasku o neuspesnosti
				$this->Session->setFlash(USER_PASS_NOT_CHANGED);
		}
	}
	
	
	
	
}
?>